﻿/**
 * @file FirmwareCore.h
 * @brief SSD仿真系统固件核心模块，负责固件执行与核心组件管理。
 */
#pragma once
#ifndef __FirmwareCore_h__
#define __FirmwareCore_h__

#include "BasicTypes.h"
#include "SimFrameworkBase/FrameworkThread.h"
#include "Nand/Hal/NandHal.h"
#include "Buffer/Hal/BufferHal.h"
#include "HostComm/CustomProtocol/CustomProtocolHal.h"

/**
 * @class FirmwareCore
 * @brief SSD仿真系统固件核心类，负责固件执行与核心组件管理。
 */
class FirmwareCore : public FrameworkThread
{
protected:
    /**
     * @brief 线程主循环，执行固件任务。
     */
    virtual void Run() override;

public:
    /**
     * @brief 构造函数。
     */
    FirmwareCore();
    /**
     * @brief 设置固件执行入口。
     * @param Filename 固件文件名
     * @return 是否设置成功
     */
    bool SetExecute(std::string Filename);
    /**
     * @brief 卸载当前固件。
     */
    void Unload();
    /**
     * @brief 设置核心硬件抽象层组件。
     * @param nandHal NAND硬件抽象层指针
     * @param bufferHal 缓冲区管理器指针
     * @param CustomProtocolHal 自定义协议处理模块指针
     */
    void SetHalComponents(NandHal *nandHal, BufferHal *bufferHal, CustomProtocolHal *CustomProtocolHal);

private:
    /**
     * @brief 切换固件执行入口。
     */
    void SwapExecute();

private:
    std::function<void()> _Execute;        /**< 当前固件执行函数 */
    std::function<void()> _NewExecute;     /**< 新固件执行函数 */
    NandHal *_NandHal;                     /**< NAND硬件抽象层指针 */
    BufferHal *_BufferHal;                 /**< 缓冲区管理器指针 */
    CustomProtocolHal *_CustomProtocolHal; /**< 自定义协议处理模块指针 */
};

#endif